#include "myplaintextedit.h"
#include <qDebug>

MyPlainTextEdit::MyPlainTextEdit(QWidget *parent):QPlainTextEdit(parent)
{
}

void MyPlainTextEdit::append(const QString &text)
{
    appendPlainText(text);
}

/**
 * @brief MyPlainTextEdit::appendNoNL，此方式插入效率比较高
 * @param text
 */
void MyPlainTextEdit::appendNoNL(const QString &text){
    moveCursor(QTextCursor::End);
    QTextCursor prevCursor = textCursor();
    int prevPos = textCursor().position();
    appendPlainText(text);
    prevCursor.setPosition(prevPos);
    setTextCursor(prevCursor);
    textCursor().deleteChar();
}

/**
 * @brief MyPlainTextEdit::appendPlainTextNoNL,在内容一多时，插入时界面非常的卡
 * @param text
 * @param check_nl
 */
void MyPlainTextEdit::appendPlainTextNoNL(const QString &text, bool check_nl){
    QScrollBar *p_scroll_bar = this->verticalScrollBar();
       bool bool_at_bottom = (p_scroll_bar->value() == p_scroll_bar->maximum());

       if (!check_nl){
          QTextCursor text_cursor = QTextCursor(this->document());
          text_cursor.movePosition(QTextCursor::End);
          text_cursor.insertText(text);
       } else {
          QTextCursor text_cursor = QTextCursor(this->document());
          text_cursor.beginEditBlock();

          text_cursor.movePosition(QTextCursor::End);

          QStringList string_list = text.split('\n');

          for (int i = 0; i < string_list.size(); i++){
             text_cursor.insertText(string_list.at(i));
             if ((i + 1) < string_list.size()){
                text_cursor.insertBlock();
             }
          }

          text_cursor.endEditBlock();
       }

       if (bool_at_bottom){
          p_scroll_bar->setValue(p_scroll_bar->maximum());
       }
}

void MyPlainTextEdit::appendHtmlNoNL(const QString &html, bool check_br)
{
   QScrollBar *p_scroll_bar = this->verticalScrollBar();
   bool bool_at_bottom = (p_scroll_bar->value() == p_scroll_bar->maximum());

   if (!check_br){
      QTextCursor text_cursor = QTextCursor(this->document());
      text_cursor.movePosition(QTextCursor::End);
      text_cursor.insertHtml(html);
   } else {

      QTextCursor text_cursor = QTextCursor(this->document());
      text_cursor.beginEditBlock();

      text_cursor.movePosition(QTextCursor::End);

      QStringList string_list = html.split(QRegExp("\\<br\\s*\\/?\\>", Qt::CaseInsensitive));

      for (int i = 0; i < string_list.size(); i++){
         text_cursor.insertHtml( string_list.at(i) );
         if ((i + 1) < string_list.size()){
            text_cursor.insertBlock();
         }
      }

      text_cursor.endEditBlock();
   }

   if (bool_at_bottom){
      p_scroll_bar->setValue(p_scroll_bar->maximum());
   }
}

/**
 * Just insert new QTextBlock to the text.
 * (in fact, adds new paragraph)
 */
void MyPlainTextEdit::insertNL()
{
   QScrollBar *p_scroll_bar = this->verticalScrollBar();
   bool bool_at_bottom = (p_scroll_bar->value() == p_scroll_bar->maximum());

   QTextCursor text_cursor = QTextCursor(this->document());
   text_cursor.movePosition(QTextCursor::End);
   text_cursor.insertBlock();

   if (bool_at_bottom){
      p_scroll_bar->setValue(p_scroll_bar->maximum());
   }
}
